// import 'package:flutter/material.dart';
// import 'package:http/http.dart' as http;
// import 'dart:convert';
// import 'news.dart';
// import 'NewsDetail.dart';
//
// class StatusPage extends StatefulWidget {
//   const StatusPage({super.key});
//
//   @override
//   _StatusPageState createState() => _StatusPageState();
// }
//
// class _StatusPageState extends State<StatusPage> {
//   List<News> _datas = [];
//   bool _isLoading = true;
//   bool _hasError = false;
//
//   @override
//   void initState() {
//     super.initState();
//     _fetchData();
//   }
//
//   Future<void> _fetchData() async {
//     setState(() {
//       _isLoading = true;
//       _hasError = false;
//     });
//     try {
//       final datas = await getDatas();
//       setState(() {
//         _datas = datas;
//         _isLoading = false;
//       });
//     } catch (e) {
//       setState(() {
//         _hasError = true;
//         _isLoading = false;
//       });
//       print('Error fetching data: $e');
//     }
//   }
//
//   // 下拉刷新函数
//   Future<void> _refreshData() async {
//     await _fetchData(); // 调用已有的 _fetchData 函数重新获取数据
//   }
//
//   @override
//   Widget build(BuildContext context) {
//     return Scaffold(
//         body: _isLoading
//             ? const Center(child: CircularProgressIndicator())
//             : _hasError
//                 ? Center(
//                     child: Column(
//                       mainAxisAlignment: MainAxisAlignment.center,
//                       children: [
//                         const Text('数据加载失败，请稍后重试！',
//                             style: TextStyle(color: Colors.red)),
//                         ElevatedButton(
//                           onPressed: _fetchData,
//                           child: const Text('重试'),
//                         ),
//                       ],
//                     ),
//                   )
//                 : RefreshIndicator(
//                     onRefresh: _refreshData,  // 触发下拉刷新功能
//                     child: ListView.builder(
//                       itemCount: _datas.length,
//                       itemBuilder: (context, index) {
//                         final news = _datas[index];
//                         return Card(
//                           color: Colors.grey[200],
//                           elevation: 5.0,
//                           margin: const EdgeInsets.symmetric(
//                               horizontal: 10, vertical: 6),
//                           child: Builder(
//                               builder: (context) => InkWell(
//                                     child: new Column(
//                                       crossAxisAlignment:
//                                           CrossAxisAlignment.start,
//                                       children: [
//                                         news.picUrl != null
//                                             ? Image.network(
//                                                 news.picUrl!,
//                                                 fit: BoxFit.cover,
//                                                 errorBuilder: (context, error,
//                                                     stackTrace) {
//                                                   return const Icon(
//                                                     Icons.broken_image,
//                                                     size: 80,
//                                                     color: Colors.grey,
//                                                   );
//                                                 },
//                                               )
//                                             : const Icon(Icons.broken_image,
//                                                 size: 80, color: Colors.grey),
//                                         Padding(
//                                           padding: const EdgeInsets.all(10.0),
//                                           child: Text(
//                                             news.title ?? '无标题',
//                                             style: const TextStyle(
//                                                 fontSize: 16.0,
//                                                 fontWeight: FontWeight.bold),
//                                           ),
//                                         ),
//                                         if (news.description?.isNotEmpty ??
//                                             false)
//                                           Padding(
//                                             padding: const EdgeInsets.symmetric(
//                                                 horizontal: 10.0),
//                                             child: Text(
//                                               news.description!,
//                                               style: const TextStyle(
//                                                   fontSize: 14.0,
//                                                   color: Colors.black54),
//                                             ),
//                                           ),
//                                         Padding(
//                                           padding: const EdgeInsets.all(10.0),
//                                           child: Text(
//                                             '时间: ${news.ctime ?? '未知'}',
//                                             style: const TextStyle(
//                                                 fontSize: 12.0,
//                                                 color: Colors.black54),
//                                           ),
//                                         ),
//                                       ],
//                                     ),
//                                     // onTap: () {
//                                     //   // 可以添加跳转或更多功能
//                                     //   Navigator.push(context, MaterialPageRoute(builder: (context) => NewsDetail(url: news.url!, title: news.title!)));
//                                     // },
//                                     onTap: () => Navigator.of(context)
//                                         .push(MaterialPageRoute(
//                                             builder: (context) => NewsDetail(
//                                                   url: _datas[index]
//                                                       .url
//                                                       .toString(),
//                                                   title: _datas[index]
//                                                       .title
//                                                       .toString(),
//                                                 ))),
//                                   )),
//                         );
//                       },
//                     ),
//                   ));
//   }
//
//   Future<List<News>> getDatas() async {
//     final response = await http.get(Uri.parse(
//         'https://apis.tianapi.com/generalnews/index?key=9acd0db09070970c72540770f62fffce&num=20&page=1'));
//
//     if (response.statusCode == 200) {
//       Utf8Decoder decoder = const Utf8Decoder();
//       Map<String, dynamic> result =
//           jsonDecode(decoder.convert(response.bodyBytes));
//
//       if (result['code'] == 200) {
//         List<dynamic> newsList = result['result']['newslist'];
//         return newsList.map((item) => News.fromJson(item)).toList();
//       } else {
//         throw Exception('Failed to load news: ${result['msg']}');
//       }
//     } else {
//       throw Exception(
//           'Failed to load news with status code: ${response.statusCode}');
//     }
//   }
// }

import 'dart:io';
import 'dart:math';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';  // 用于生成哈希值
import 'DatabaseHelper.dart';
import 'News.dart';
import 'NewsDetail.dart';
import 'package:crypto/crypto.dart';

class StatusPage extends StatefulWidget {
  const StatusPage({super.key});

  @override
  StatusPageState createState() => StatusPageState();
}

class StatusPageState extends State<StatusPage> {
  List<News> _datas = [];
  bool _isLoading = true;
  bool _hasError = false;

  @override
  void initState() {
    super.initState();
    _fetchData();
  }

  Future<void> _fetchData() async {
    setState(() {
      _isLoading = true; // 显示加载指示器
      _hasError = false; // 默认没有错误
    });

    try {
      // 尝试从网络获取数据
      final datas = await getDatas();
      setState(() {
        _datas = datas; // 更新页面上的数据
        _saveDataToLocalDB(datas); // 保存数据到本地数据库
        _isLoading = false; // 加载完成
      });
    } catch (e) {
      print('网络请求失败: $e');

      // 如果网络请求失败，从本地数据库加载数据
      final localData = await DatabaseHelper.instance.getAllNews();
      setState(() {
        _datas = localData; // 使用本地数据更新页面
        _hasError = true; // 标记加载失败
        _isLoading = false; // 加载完成
      });
    }
  }

  Future<void> _saveDataToLocalDB(List<News> newsList) async {
    final db = await DatabaseHelper.instance.database;

    // 清空旧数据
    await db.delete('news');
    print('旧数据已清空');

    // 插入新数据
    for (var news in newsList) {
      try {
        await DatabaseHelper.instance.insertNews(news);
        print('插入新闻成功: ${news.title}');
      } catch (e) {
        print('插入新闻失败: $e');
      }
    }
    for (var news in newsList) {
      if (news.picUrl != null && news.picUrl!.isNotEmpty) {
        // 下载并保存图片到本地
        final localPath = await saveImageToLocal(news.picUrl!);
        print('Image saved at: $localPath');
      }
      await DatabaseHelper.instance.insertNews(news);
    }
  }

  // 图片保存,下载和存储图片
  Future<String> saveImageToLocal(String imageUrl) async {
    try {
      final response = await http.get(Uri.parse(imageUrl));
      if (response.statusCode == 200) {
        // 获取应用的本地存储路径
        final directory = await getApplicationDocumentsDirectory();
        // 用图片 URL 的哈希值生成文件名
        final fileName = md5.convert(utf8.encode(imageUrl)).toString();
        final filePath = '${directory.path}/$fileName.jpg';

        // 将图片数据写入文件
        final file = File(filePath);
        await file.writeAsBytes(response.bodyBytes);
        print('图片保存成功，保存在 $filePath');
        return filePath; // 返回文件路径
      } else {
        throw Exception('Failed to download image: ${response.statusCode}');
      }
    } catch (e) {
      print('Error saving image: $e');
      return ''; // 如果保存失败，返回空字符串
    }
  }

  // 加载本地图片,从本地文件系统读取图片
  Future<File?> getLocalImage(String imageUrl) async {
    try {
      final directory = await getApplicationDocumentsDirectory();
      final fileName = md5.convert(utf8.encode(imageUrl)).toString();
      final filePath = '${directory.path}/$fileName.jpg';

      final file = File(filePath);
      if (await file.exists()) {
        return file; // 返回本地文件
      } else {
        return null; // 文件不存在
      }
    } catch (e) {
      print('Error loading local image: $e');
      return null;
    }
  }

  // 下拉刷新函数
  Future<void> _refreshData() async {
    await _fetchData(); // 调用已有的 _fetchData 函数重新获取数据
  }

  // 补充基础URL
  String fixImageUrl(String url) {
    if (url.startsWith('http://') || url.startsWith('https://')) {
      return url; // 如果已经是完整的URL，直接返回
    } else {
      return 'https:$url'; // 补充基础URL
    }
  }

  // 补充基础URL
  String fixUrl(String url) {
    // 判断url是否以 http:// 或 https:// 开头
    if (url.startsWith('http://') || url.startsWith('https://')) {
      return url; // 如果已经是完整的URL，直接返回
    } else {
      return 'https:$url'; // 补充基础URL
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: _isLoading
            ? const Center(child: CircularProgressIndicator()) // 加载中指示器
            : _datas.isEmpty
                ? Center(
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Text(_hasError ? '网络不可用，加载本地数据失败！' : '暂无新闻数据，请稍后重试！'),
                        if (_hasError)
                          ElevatedButton(
                            onPressed: _fetchData, // 提供重试按钮
                            child: const Text('重试'),
                          ),
                      ],
                    ),
                  )
                : RefreshIndicator(
                    onRefresh: _refreshData, // 触发下拉刷新功能
                    child: ListView.builder(
                      itemCount: _datas.length,
                      itemBuilder: (context, index) {
                        final news = _datas[index];
                        return Card(
                          color: Colors.grey[200],
                          elevation: 5.0,
                          margin: const EdgeInsets.symmetric(
                              horizontal: 10, vertical: 6),
                          child: Builder(
                              builder: (context) => InkWell(
                                    child: new Column(
                                      crossAxisAlignment:
                                          CrossAxisAlignment.start,
                                      children: [
                                        FutureBuilder<File?>(
                                          future: getLocalImage(news.picUrl ?? ''),
                                          builder: (context, snapshot) {
                                            if (snapshot.connectionState ==
                                                ConnectionState.waiting) {
                                              return const CircularProgressIndicator();
                                            } else if (snapshot.hasData &&
                                                snapshot.data != null) {
                                              return Image.file(
                                                snapshot.data!,
                                                fit: BoxFit.cover,
                                              );
                                            } else {
                                              // 加载失败或无本地图片，显示默认图片
                                              print("加载失败或无本地图片");
                                              return const Icon(
                                                Icons.broken_image,
                                                size: 80,
                                                color: Colors.grey,
                                              );
                                            }
                                          },
                                        ),
                                        Padding(
                                          padding: const EdgeInsets.all(10.0),
                                          child: Text(
                                            news.title ?? '无标题',
                                            style: const TextStyle(
                                                fontSize: 16.0,
                                                fontWeight: FontWeight.bold),
                                          ),
                                        ),
                                        if (news.description?.isNotEmpty ??
                                            false)
                                          Padding(
                                            padding: const EdgeInsets.symmetric(
                                                horizontal: 10.0),
                                            child: Text(
                                              news.description!,
                                              style: const TextStyle(
                                                  fontSize: 14.0,
                                                  color: Colors.black54),
                                            ),
                                          ),
                                        Padding(
                                          padding: const EdgeInsets.all(10.0),
                                          child: Text(
                                            '时间: ${news.ctime ?? '未知'}',
                                            style: const TextStyle(
                                                fontSize: 12.0,
                                                color: Colors.black54),
                                          ),
                                        ),
                                      ],
                                    ),
                                    onTap: () => Navigator.of(context)
                                        .push(MaterialPageRoute(
                                            builder: (context) => NewsDetail(
                                                  url: fixUrl(_datas[index]
                                                      .url
                                                      .toString()),
                                                  title: _datas[index]
                                                      .title
                                                      .toString(),
                                                ))),
                                  )),
                        );
                      },
                    ),
                  ));
  }

  // test部分
  // Future<List<News>> getDatas({http.Client? client}) async {
  //   client ??= http.Client(); // 使用传入的 Client 或创建一个新的
  //   // 创建一个随机数生成器
  //   // final random = Random();
  //
  //   // 随机生成 num 和 page 参数，范围是 10-20
  //   // int num = random.nextInt(11) + 10; // 生成一个 [10, 20] 范围内的随机数
  //   // int page = random.nextInt(11) + 1; // 同样为 page 生成一个 [1, 11] 范围内的随机数
  //
  //   final response = await client.get(Uri.parse(
  //       'https://apis.tianapi.com/generalnews/index?key=9acd0db09070970c72540770f62fffce&num=10&page=1'));

  Future<List<News>> getDatas() async {

      // 创建一个随机数生成器
      final random = Random();

      // 随机生成 num 和 page 参数，范围是 10-20
      int num = random.nextInt(11) + 10; // 生成一个 [10, 20] 范围内的随机数
      int page = random.nextInt(11) + 1; // 同样为 page 生成一个 [1, 11] 范围内的随机数

      final response = await http.get(Uri.parse(
          'https://apis.tianapi.com/generalnews/index?key=9acd0db09070970c72540770f62fffce&num=$num&page=$page'));

    if (response.statusCode == 200) {
      Utf8Decoder decoder = const Utf8Decoder();
      Map<String, dynamic> result =
          jsonDecode(decoder.convert(response.bodyBytes));

      if (result['code'] == 200) {
        List<dynamic> newsList = result['result']['newslist'];
        return newsList.map((item) => News.fromJson(item)).toList();
      } else {
        throw Exception('Failed to load news: ${result['msg']}');
      }
    } else {
      throw Exception(
          'Failed to load news with status code: ${response.statusCode}');
    }
  }
}
